//
//  ServerInfoResponse.m
//  Moonlight
//
//  Created by Diego Waxemberg on 2/1/15.
//  Copyright (c) 2015 Moonlight Stream. All rights reserved.
//

#import "ServerInfoResponse.h"
#import <libxml2/libxml/xmlreader.h>
#include "PortManager.h"

@implementation ServerInfoResponse
@synthesize data, statusCode, statusMessage;

- (void)populateWithData:(NSData *)xml {
    self.data = xml;
    [super parseData];
}

- (void)populateHost:(TemporaryHost*)host {
    host.name = [[self getStringTag:TAG_HOSTNAME] trim];
    host.uuid = [[self getStringTag:TAG_UNIQUE_ID] trim];
    host.mac = [[self getStringTag:TAG_MAC_ADDRESS] trim];
    host.currentGame = [[self getStringTag:TAG_CURRENT_GAME] trim];
    
    NSInteger httpsPort;
    if ([self getIntTag:TAG_HTTPS_PORT value:&httpsPort]) {
        host.httpsPort = (unsigned short)httpsPort;
    }else {
        // 如果没有从serviceinfo接口中获取到数据，则使用默认值
        host.httpsPort = getDefaultPort();
    }

    //我们可能会得到一个IPv4环回地址，如果我们使用GS IPv6转发器
    NSString *lanAddr = [[self getStringTag:TAG_LOCAL_IP] trim];
    if (![lanAddr hasPrefix:@"127."]) {
        unsigned short localPort;
        
        // 如果我们通过这个端口到达主机，把我们的端口存储在这里
        if (host.activeAddress && [lanAddr isEqualToString:[Utils addressPortStringToAddress:host.activeAddress]]) {
            localPort = [Utils addressPortStringToPort:host.activeAddress];
        }
//        else if (host.localAddress) {
//            // 如果存在现有的本地地址，则使用其中的端口
//            localPort = [Utils addressPortStringToPort:host.localAddress];
//        }
        else {
            // 如果其他方法都失败，则使用默认端口
            localPort = getDefaultPort();
        }
        
//        host.localAddress = [Utils addressAndPortToAddressPortString:lanAddr port:localPort];
    }
    
    // 这是一个广域网端口重新映射的Sunshine扩展
    NSInteger externalHttpPort;
    if (![self getIntTag:TAG_EXTERNAL_PORT value:&externalHttpPort]) {
        // 如果没有指定，使用我们的活动端口
        if (host.activeAddress) {
            externalHttpPort = [Utils addressPortStringToPort:host.activeAddress];
        }else {
            // 否则使用默认值
            externalHttpPort = getDefaultPort();
        }
    }
    
    // 现代GFE版本实际上不再给我们一个WAN地址
    // 因此我们保留通过STUN从mDNS发现中填充的那个。
    NSString *wanAddr = [[self getStringTag:TAG_EXTERNAL_IP] trim];
    if (wanAddr) {
        host.externalAddress = [Utils addressAndPortToAddressPortString:wanAddr port:externalHttpPort];
    }else if (host.externalAddress) {
        //如果我们已经有了外部地址(通过STUN)，我们仍然需要填充端口
        host.externalAddress = [Utils addressAndPortToAddressPortString:[Utils addressPortStringToAddress:host.externalAddress] port:externalHttpPort];
    }
    
    NSString *state = [[self getStringTag:TAG_STATE] trim];
    if (![state hasSuffix:@"_SERVER_BUSY"]) {
        // GFE 2.8开始保持currentgame设置为最后一场比赛。结果，它不再
        //具有其名称所指示的语义。尽可能多地控制这种变化的影响
        //如果服务器不在流会话中，我们将强制当前游戏为零。
        host.currentGame = @"0";
    }
    
    // GFE在其状态枚举值中使用Mjolnir代码名
    host.isNvidiaServerSoftware = [state containsString:@"MJOLNIR"];
    
    NSInteger pairStatus;
    if ([self getIntTag:TAG_PAIR_STATUS value:&pairStatus]) {
        host.pairState = pairStatus ? PairStatePaired : PairStateUnpaired;
    } else {
        host.pairState = PairStateUnknown;
    }
    
    NSString *serverCodecModeString = [self getStringTag:@"ServerCodecModeSupport"];
    if (serverCodecModeString != nil) {
        host.serverCodecModeSupport = [[serverCodecModeString trim] intValue];
    }
}

@end
